/*
 * @lc app=leetcode.cn id=746 lang=cpp
 *
 * [746] 使用最小花费爬楼梯
 *
 * https://leetcode-cn.com/problems/min-cost-climbing-stairs/description/
 *
 * algorithms
 * Easy (61.63%)
 * Likes:    897
 * Dislikes: 0
 * Total Accepted:    208.2K
 * Total Submissions: 337.2K
 * Testcase Example:  '[10,15,20]'
 *
 * 给你一个整数数组 cost ，其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用，即可选择向上爬一个或者两个台阶。
 * 
 * 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
 * 
 * 请你计算并返回达到楼梯顶部的最低花费。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：cost = [10,15,20]
 * 输出：15
 * 解释：你将从下标为 1 的台阶开始。
 * - 支付 15 ，向上爬两个台阶，到达楼梯顶部。
 * 总花费为 15 。
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：cost = [1,100,1,1,1,100,1,1,100,1]
 * 输出：6
 * 解释：你将从下标为 0 的台阶开始。
 * - 支付 1 ，向上爬两个台阶，到达下标为 2 的台阶。
 * - 支付 1 ，向上爬两个台阶，到达下标为 4 的台阶。
 * - 支付 1 ，向上爬两个台阶，到达下标为 6 的台阶。
 * - 支付 1 ，向上爬一个台阶，到达下标为 7 的台阶。
 * - 支付 1 ，向上爬两个台阶，到达下标为 9 的台阶。
 * - 支付 1 ，向上爬一个台阶，到达楼梯顶部。
 * 总花费为 6 。
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 2 <= cost.length <= 1000
 * 0 <= cost[i] <= 999
 * 
 * 
 */

// @lc code=start
class Solution {
// // 第一步 不需要 花费
// // 往前爬 才需要花费，不往前爬不需要花费，是题意中要求的
// public:
//     int minCostClimbingStairs(vector<int>& cost) {
//         // 预留空间是cost的size+1, 原因是
//         // 往前爬是需要花费费用的，现在求的是最后爬完了情况，也就是cost有size，
//         // 但是当前要求的是size+1需要花费的费用
//         vector<int> dp(cost.size() + 1);
//         dp[0] = 0;
//         dp[1] = 0;

//         for(int i = 2; i <= cost.size(); i++) {
//             dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
//         }
//         return dp.back();
//     }

// 最后一步不需要 花费
// 凡是到了的，就需要花费，往前是不需要的，只有到了，才需要花费
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size());
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i = 2; i < cost.size(); i++) {
            dp[i] = min(dp[i-1], dp[i-2]) + cost[i];
        }
        return min(dp[cost.size()-1], dp[cost.size()-2]);
    }; 
};
// @lc code=end

